package com.chapter.sample.redis.boolmfilter;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 布隆过滤器白名单初始化工具类，一开始就设置一部分数据为白名单所有
 * 白明单默认规则：布隆过滤器有,redis极大可能有
 * 白名单：whitelistCustomer
 */
@Component
@Slf4j
public class BloomFilterInit {

    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct//初始化
    public void init() {
        //白名单客户加载到布隆过滤器
        String key = "customer:12";
        //计算hashValue，由于计算出来负数的肯能，取绝对值
        int hashValue = Math.abs(key.hashCode());
        //3、通过hashValue和2的32次方取余，获得对应的下标坑位
        long index = (long) (hashValue % Math.pow(2, 32));
        log.info(key + "对应的坑位index：{}", index);
        //4、设置redis里面的bitmap对应类型白名单：whitelistCustomer 的坑位，将该值设置位1
        redisTemplate.opsForValue().setBit("whitelistCustomer", index, true);
    }
}
